from solicitudCambio import SolicitudCambio, db_session
from sqlalchemy import exc
from proyecto import Proyecto
from comite import Comite
from flask import flash
session = db_session()

class SolicitudCambioManager(object):
    """Clase encargada del manejo de solicitudes de cambio"""
    def __init__(self):
        pass
    def __repr__(self):
        return '<Solicitud Manager>'
    
    def guardarSolicitudCambio(self, solicitud):
        """
        Metodo encargado de almacenar una solicitud de cambio en la base de datos
        @param solicitud: Objeto solicitud que se desea guardar.
        """
        session.add(solicitud)
        try:
            session.commit()
        except exc.IntegrityError as ex:
            session.rollback()
            return flash("La solicitud ya existe", "error")
        else:
            return flash("Solicitud registrada exitosamente")
#        session.close()
        
    def eliminarSolicitudCambio(self, idsolicitud):
        """
        Metodo encargado de eliminar una solicitud de la base de datos
        @param idsolicitud: id de la solicitud que se desea eliminar.
        """
#        session = db_session()
        solicitud = session.query(SolicitudCambio).filter(SolicitudCambio.idsolicitud==idsolicitud).first()
        session.delete(solicitud)
        session.commit()
        
    def getSolicitudCambio(self, idsolicitud):
        """
        Metodo encargado de retornar una solicitud dado su idsolicitud
        @param idsolicitud: id de la solicitud de cambio que se desea obtener.
        """
        solicitud = session.query(SolicitudCambio).filter(SolicitudCambio.idsolicitud==idsolicitud).first()
        return solicitud
    
    def getSolicitudesCambio(self):
        """Metodo encargado de retornar las solicitudes de la base de datos"""
        solicitudes = session.query(SolicitudCambio)
        return solicitudes
    
    def getSolicitudesPaginado(self, idproyecto, nombre, desde, hasta):
        """
        Metodo encargado de paginar las solicitudes de cambio
        @param idproyecto: id del proyecto cuyas solicitudes se desean obtener.
        @param nombre: nombre de la solicitud que se desea obtener.
        @param desde: indica incio.
        @param hasta: indica fin.
        """
        if nombre == "":
            nombre = "%"
        else:
            nombre = "%"+nombre+"%"

        if desde != None and hasta != None:
            sc = session.query(SolicitudCambio).join(Comite).filter(Comite.idproyecto==idproyecto).\
                                        filter(SolicitudCambio.observacion.like(nombre))[desde:hasta]
            return sc
        else:
            total = session.query(SolicitudCambio).join(Comite).filter(Comite.idproyecto==idproyecto).\
                                        filter(SolicitudCambio.observacion.like(nombre)).count()
            return total

                    
    def getNumeroSolicitudDelProyecto(self, idproyecto):
        sc = session.query(Proyecto).join(Comite).join(SolicitudCambio).\
        filter(Proyecto.idproyecto== idproyecto).distinct().count()
        return sc + 1